package com.xhj.mybatis.type;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;

/**
 * SimpleTypeRegistry
 *
 * @author XJks
 * @description SimpleTypeRegistry 类用于注册和判断常见的简单类型（如 String、Integer 等）。
 */
public class SimpleTypeRegistry {

    /**
     * 定义一个静态集合，用于存储所有被认为是“简单类型”的 Class 对象
     */
    private static final Set<Class<?>> SIMPLE_TYPE_SET = new HashSet<>();

    /**
     * 静态代码块，在类加载时执行，将常见的简单类型添加到集合中
     */
    static {
        SIMPLE_TYPE_SET.add(String.class);        // 字符串类型
        SIMPLE_TYPE_SET.add(Byte.class);          // 包装类型：字节
        SIMPLE_TYPE_SET.add(Short.class);         // 包装类型：短整型
        SIMPLE_TYPE_SET.add(Character.class);     // 包装类型：字符
        SIMPLE_TYPE_SET.add(Integer.class);       // 包装类型：整型
        SIMPLE_TYPE_SET.add(Long.class);          // 包装类型：长整型
        SIMPLE_TYPE_SET.add(Float.class);         // 包装类型：浮点型
        SIMPLE_TYPE_SET.add(Double.class);        // 包装类型：双精度浮点型
        SIMPLE_TYPE_SET.add(Boolean.class);       // 包装类型：布尔型
        SIMPLE_TYPE_SET.add(Date.class);          // 日期类型
        SIMPLE_TYPE_SET.add(Class.class);         // Class 类型本身
        SIMPLE_TYPE_SET.add(BigInteger.class);    // 大整数类型
        SIMPLE_TYPE_SET.add(BigDecimal.class);    // 大小数类型
    }

    /**
     * 私有构造方法，防止外部实例化该类（因为所有方法和数据都是静态的）
     */
    private SimpleTypeRegistry() {
        // 阻止实例化
    }

    /**
     * 判断传入的类是否是已知的简单类型
     *
     * @param clazz 需要判断的类
     * @return 如果是已知的简单类型则返回 true，否则返回 false
     */
    public static boolean isSimpleType(Class<?> clazz) {
        // 判断集合中是否包含该类
        return SIMPLE_TYPE_SET.contains(clazz);
    }

}
